#!/bin/bash

# 小智ESP32服务器 - 配置文件设置脚本
# 用于创建和管理配置文件

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 获取脚本所在目录
get_script_dir() {
    echo "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
}

# 检查配置文件是否存在
check_config_exists() {
    local config_file="$1"
    if [[ -f "$config_file" ]]; then
        return 0
    else
        return 1
    fi
}

# 创建data目录
create_data_dir() {
    local script_dir=$(get_script_dir)
    local data_dir="$script_dir/data"
    
    if [[ ! -d "$data_dir" ]]; then
        log_info "正在创建data目录..."
        mkdir -p "$data_dir"
        log_success "data目录创建完成"
    else
        log_info "data目录已存在"
    fi
}

# 创建基础配置文件
create_basic_config() {
    local script_dir=$(get_script_dir)
    local config_file="$script_dir/data/.config.yaml"
    
    log_info "正在创建基础配置文件..."
    
    cat > "$config_file" << 'EOF'
# 小智ESP32服务器 - 基础配置文件
# 此文件优先级高于config.yaml，仅包含需要覆盖的配置

# 服务器基本配置
server:
  # WebSocket地址 - 必须修改为你的实际IP或域名
  websocket: ws://YOUR_IP_OR_DOMAIN:8000/xiaozhi/v1/
  # 视觉分析接口地址 - 必须修改为你的实际IP或域名  
  vision_explain: http://YOUR_IP_OR_DOMAIN:8003/mcp/vision/explain

# 默认使用的模块配置
selected_module:
  # 语音识别模块
  ASR: FunASR
  # 大语言模型模块
  LLM: DoubaoLLM
  # 语音合成模块
  TTS: QwenTTS

# 大语言模型配置
LLM:
  # 豆包大模型配置
  DoubaoLLM:
    api_key: "YOUR_DOUbao_API_KEY"
    model: "doubao-lite-128k"
    base_url: "https://ark.cn-beijing.volces.com/api/v3"
    system_prompt: "你是小智，一个来自台湾的00后女生，说话机车但声音好听。"

# 语音合成配置
TTS:
  # 通义千问TTS配置
  QwenTTS:
    type: "qwen_tts"
    api_key: "YOUR_QWEN_API_KEY"
    model: "sambert-zhichu-v1"
    voice: "zhichu"
    language_type: "zh"
    output_dir: "tmp/"

# 语音识别配置
ASR:
  # FunASR本地语音识别
  FunASR:
    model_dir: "models/SenseVoiceSmall"

# 插件配置
plugins:
  # 天气插件配置
  get_weather:
    api_key: "YOUR_WEATHER_API_KEY"
    default_location: "北京"

# 日志配置
log:
  log_level: INFO
  log_dir: tmp
  data_dir: data
EOF

    log_success "基础配置文件创建完成"
    log_warning "请编辑 $config_file 文件，替换其中的占位符（YOUR_*）"
}

# 从config.yaml复制配置
copy_from_default() {
    local script_dir=$(get_script_dir)
    local source_config="$script_dir/config.yaml"
    local target_config="$script_dir/data/.config.yaml"
    
    if [[ ! -f "$source_config" ]]; then
        log_error "源配置文件不存在：$source_config"
        return 1
    fi
    
    log_info "正在从默认配置文件复制..."
    cp "$source_config" "$target_config"
    log_success "配置文件复制完成"
    log_warning "请根据需要编辑 $target_config 文件"
}

# 创建最小配置文件
create_minimal_config() {
    local script_dir=$(get_script_dir)
    local config_file="$script_dir/data/.config.yaml"
    
    log_info "正在创建最小配置文件..."
    
    cat > "$config_file" << 'EOF'
# 最小配置文件 - 仅包含必需项
server:
  websocket: ws://localhost:8000/xiaozhi/v1/
  vision_explain: http://localhost:8003/mcp/vision/explain

selected_module:
  LLM: ChatGLMLLM

LLM:
  ChatGLMLLM:
    api_key: "YOUR_API_KEY_HERE"
EOF

    log_success "最小配置文件创建完成"
    log_warning "请编辑 $config_file 文件，添加你的API密钥"
}

# 显示配置说明
show_config_help() {
    echo "========================================"
    echo "📋 配置文件使用说明"
    echo "========================================"
    echo ""
    echo "🔧 配置优先级（从高到低）："
    echo "1. data/.config.yaml - 用户自定义配置（最高优先级）"
    echo "2. config.yaml - 默认配置"
    echo ""
    echo "📁 配置文件位置："
    echo "- 默认配置：$(get_script_dir)/config.yaml"
    echo "- 用户配置：$(get_script_dir)/data/.config.yaml"
    echo ""
    echo "⚙️  常用配置项："
    echo "- server.websocket: WebSocket连接地址"
    echo "- server.vision_explain: 视觉分析接口地址"
    echo "- selected_module.LLM: 大语言模型选择"
    echo "- LLM.*.api_key: 模型API密钥"
    echo "- TTS.*.api_key: 语音合成API密钥"
    echo ""
    echo "🚀 快速开始："
    echo "1. 编辑 data/.config.yaml 文件"
    echo "2. 替换其中的占位符（YOUR_*）"
    echo "3. 启动服务：python app.py"
    echo ""
    echo "📖 详细配置说明："
    echo "查看 config.yaml 文件中的注释说明"
    echo "========================================"
}

# 验证配置文件
validate_config() {
    local script_dir=$(get_script_dir)
    local config_file="$script_dir/data/.config.yaml"
    
    if [[ ! -f "$config_file" ]]; then
        log_error "配置文件不存在：$config_file"
        return 1
    fi
    
    log_info "正在验证配置文件..."
    
    # 检查必需字段
    local errors=0
    
    if ! grep -q "websocket:" "$config_file"; then
        log_error "缺少 websocket 配置"
        errors=$((errors + 1))
    fi
    
    if ! grep -q "api_key:" "$config_file"; then
        log_error "缺少 api_key 配置"
        errors=$((errors + 1))
    fi
    
    if grep -q "YOUR_" "$config_file"; then
        log_warning "发现未替换的占位符（YOUR_*）"
        errors=$((errors + 1))
    fi
    
    if [[ $errors -eq 0 ]]; then
        log_success "配置文件验证通过"
        return 0
    else
        log_error "配置文件验证失败，请修正上述问题"
        return 1
    fi
}

# 显示菜单
show_menu() {
    echo "========================================"
    echo "小智ESP32服务器 - 配置文件设置工具"
    echo "========================================"
    echo ""
    echo "请选择操作："
    echo "1. 创建基础配置文件（推荐）"
    echo "2. 从config.yaml复制配置"
    echo "3. 创建最小配置文件"
    echo "4. 验证现有配置"
    echo "5. 查看配置说明"
    echo "6. 退出"
    echo ""
    echo "========================================"
}

# 主函数
main() {
    local script_dir=$(get_script_dir)
    
    # 检查是否在正确的目录
    if [[ ! -f "$script_dir/config.yaml" ]]; then
        log_error "请在 xiaozhi-server 目录下运行此脚本"
        exit 1
    fi
    
    # 创建data目录
    create_data_dir
    
    # 如果存在命令行参数，直接执行对应操作
    if [[ $# -gt 0 ]]; then
        case "$1" in
            "basic"|"1")
                create_basic_config
                show_config_help
                ;;
            "copy"|"2")
                copy_from_default
                show_config_help
                ;;
            "minimal"|"3")
                create_minimal_config
                show_config_help
                ;;
            "validate"|"4")
                validate_config
                ;;
            "help"|"5")
                show_config_help
                ;;
            *)
                log_error "未知参数: $1"
                echo "用法: $0 [basic|copy|minimal|validate|help]"
                exit 1
                ;;
        esac
        exit 0
    fi
    
    # 交互式菜单
    while true; do
        show_menu
        read -p "请输入选择 (1-6): " choice
        
        case $choice in
            1)
                create_basic_config
                show_config_help
                break
                ;;
            2)
                copy_from_default
                show_config_help
                break
                ;;
            3)
                create_minimal_config
                show_config_help
                break
                ;;
            4)
                validate_config
                ;;
            5)
                show_config_help
                ;;
            6)
                log_info "退出配置工具"
                break
                ;;
            *)
                log_error "无效选择，请输入1-6"
                ;;
        esac
        
        echo ""
        read -p "按回车键继续..."
    done
}

# 运行主函数
main "$@"